#include "Linea.h"
#include <cstdlib>
#include <cmath>
#include <GL/glut.h>
#include <GL/gl.h>
#include "Definiciones.h"

char Linea::metodoDibujo = 'B'; // metodo default Bresenham

Linea::Linea(const Punto& pi, const Punto& pf) {
	this->inicio = pi;
	this->fin = pf;
}

Linea::~Linea() {
}

void Linea::setIncio(const Punto& p) {
	this->inicio = p;
}

void Linea::setFin(const Punto& p) {
	this->fin = p;
}

Punto Linea::getInicio() const{
	return this->inicio;
}

Punto Linea::getFin() const{
	return this->fin;
}
void Linea::pintar(Matriz3D& mat){}

void Linea::dibujarContorno(Matriz3D& mat) {
	glColor3f(colorLinea.r(),colorLinea.g(),colorLinea.b());
	if (metodoDibujo == 'D') {
		dibujarDDA();
	} else {
		dibujarBre();
	}
}

void Linea::dibujarNoSetColor() {

	if (metodoDibujo == 'D') {
		dibujarDDA();
	} else {
		dibujarBre();
	}
}


void Linea::setMetodoDibujo(char metodo) {
	metodoDibujo = metodo;
}

void Linea::setPixel(int x, int y) {

	glBegin(GL_POINTS);
	glVertex2i(x, y);
	glEnd();
	glFlush();
}

void Linea::dibujarDDA() {
	int dX = (fin.x() - inicio.x());
	int dY = (fin.y() - inicio.y());
	int paso, cantPasos;
	float pasoX, pasoY;
	float x = inicio.x();
	float y = inicio.y();

	if (fabs(dX) > fabs(dY))
		cantPasos = fabs(dX);
	else
		cantPasos = fabs(dY);

	pasoX = float(dX) / float(cantPasos);
	pasoY = float(dY) / float(cantPasos);

	setPixel(ROUND_SIGNED(x), ROUND_SIGNED(y));
	for (paso = 0; paso < cantPasos; paso++) {
		x += pasoX;
		y += pasoY;
		setPixel(ROUND_SIGNED(x), ROUND_SIGNED(y));
	}

}

void Linea::dibujarBre() {
	bool steep = (std::abs(fin.y() - inicio.y()) > std::abs(fin.x()
			- inicio.x()));
	if (steep) {
		int temp;
		temp = inicio.x();
		inicio.x(inicio.y());
		inicio.y(temp);
		temp = fin.x();
		fin.x(fin.y());
		fin.y(temp);
	}
	if (inicio.x() > fin.x()) {
		int temp;
		temp = inicio.x();
		inicio.x(fin.x());
		fin.x(temp);
		temp = inicio.y();
		inicio.y(fin.y());
		fin.y(temp);
	}
	int deltax = (fin.x() - inicio.x());
	int deltay = std::abs((fin.y() - inicio.y()));
	int error = (int) (deltax / 2);
	int ystep = 0;
	int y = inicio.y();
	if (inicio.y() < fin.y()) {
		ystep = 1;
	} else {
		ystep = -1;
	}
	for (int x = inicio.x(); x < fin.x(); x++) {
		if (steep) {
			setPixel(y, x);
		} else {
			setPixel(x, y);
		}
		error -= deltay;
		if (error < 0) {
			y += ystep;
			error += deltax;
		}
	}
}
